import random


def quickChoice(arr, k, left=0, right=None):
    # 边界情况处理
    if not arr or k <= 0:
        return []

    n = len(arr)
    if right is None:
        right = n - 1

    # 处理超出k范围的情况
    if k >= (right - left + 1):
        return [arr[i] for i in range(left, right + 1)]

    # 随机选择枢轴避免最坏情况
    pivot_idx = random.randint(left, right)
    pivot = arr[pivot_idx]

    # 分区操作
    lo, hi = left, right
    while lo <= hi:
        # 从右找第一个大于等于枢轴的元素
        while lo <= hi and arr[hi] < pivot:
            hi -= 1
        # 从左找第一个小于等于枢轴的元素
        while lo <= hi and arr[lo] > pivot:
            lo += 1

        if lo <= hi:
            # 交换找到的元素
            arr[lo], arr[hi] = arr[hi], arr[lo]
            lo += 1
            hi -= 1

    # 计算当前找到的大于枢轴的元素数量
    larger_count = lo - left

    # 递归选择
    if k <= larger_count:
        # 前k大都在左边部分
        return quickChoice(arr, k, left, left + larger_count - 1)
    else:
        # 左边部分全是大元素，还需要从右边找剩余部分
        left_part = [arr[i] for i in range(left, lo)]
        needed = k - larger_count
        right_part = quickChoice(arr, needed, lo, right)
        return left_part + right_part


# 输入处理
n, k = map(int, input().split())
nums = list(map(int, input().split()))

# 获取结果
result = quickChoice(nums, k)

# 输出结果（从大到小排序的前k个元素）
print(sorted(result, reverse=True))
